export enum ScriptToolbarCategory {
  UserType = 'user-type',
  Feedback = 'feed-back',
  RunStatus = 'run-status',
}

/**
 * 用户反馈动作类型枚举
 * 用于表示用户对内容的互动反馈类型
 */
export enum ScriptFeedbackActionType {
  Like = 'like',
  Dislike = 'dislike',
}
/**
 * 脚本状态标记动作类型枚举
 * 用于表示对脚本运行状态的标记类型
 */
export enum ScriptStatusActionType {
  MarkSuccess = 'markSuccess',
  MarkFailed = 'markFailed',
}

export type ScriptActionType = GreasyForkUserType | ScriptFeedbackActionType | ScriptStatusActionType

/**
 * 清除动作类型枚举
 * 用于表示清除操作的类型
 */
export enum ScriptClearOperationType {
  ClearTypes = 'clearTypes',
  ClearFeedback = 'clearFeedback',
  ClearRunStatus = 'clearRunStatus',
}

export enum FeedbackToolbarCategory {
  UserType = 'user-type',
  ContentTag = 'content-tag',
  ResolutionStatus = 'resolution-status',
}

export enum GreasyForkBaseUserType {
  // 普通用户
  ActiveUser = 'active_user', // 活跃用户
  // 粉丝体系
  LoyalFan = 'loyal_fan', // 铁粉（长期使用+高评分）
  // 特殊类型
  Blacklisted = 'blacklisted', // 黑名单用户
}

export enum GreasyForkFeedbackUserType {
  FeedbackProvider = 'feedback_provider', // 反馈达人
}

export enum GreasyForkScriptUserType {
  SuperCreator = 'super_creator', // 脚本大神（高质量作品作者）
}

/**
 * 所有人员类型
 */
export enum GreasyForkUserType {
  ActiveUser = 'active_user',
  LoyalFan = 'loyal_fan',
  Blacklisted = 'blacklisted',
  SuperCreator = 'super_creator',
  FeedbackProvider = 'feedback_provider',
}

/**
 * 内容标记类型
 * 表示对反馈内容的分类标记
 */
export enum FeedbackTagType {
  Problem = 'problem', // 问题报告
  Suggestion = 'suggestion', // 功能建议
  Praise = 'praise', // 用户好评
  Neutral = 'neutral', // 一般评价
  Negative = 'negative', // 用户差评
  Malicious = 'malicious', // 恶意行为
  Other = 'other', // 其他类型
}

/**
 * 处理状态类型（原ScriptStatusActionType）
 * 表示反馈的处理进度状态
 */
export enum ResolutionStatusType {
  Unresolved = 'unresolved', // 未解决
  Resolving = 'resolving', // 解决中
  PendingVerification = 'pendingVerification', // 待验证
  Resolved = 'resolved', // 已解决
  Deferred = 'deferred', // 延期处理
  OnHold = 'onHold', // 挂起
  Invalid = 'invalid', // 无效反馈
}

/**
 * Feedback 动作类型
 */
export type FeedbackActionType = GreasyForkUserType | FeedbackTagType | ResolutionStatusType

/**
 * 清除操作类型
 */
export enum FeedbackClearOperationType {
  ClearTypes = 'clearTypes', // 清除用户类型
  ClearTags = 'clearTags', // 清除内容标记
  ClearStatus = 'clearStatus', // 清除处理状态
  ClearAllTypes = 'clearAllTypes',
  ClearAllTags = 'clearAllTags',
  clearAllStatus = 'clearAllStatus',
}

export interface ActionHandler {
  [key: string]: (event: JQuery.ClickEvent, type: any) => void
}

// 使用枚举值作为键的类型
export type EnumValueKeys<T extends Record<string, string>> = {
  [K in keyof T as T[K]]: GreasyForkStatsItem
}

/**
 * ID项接口
 */
export interface GreasyForkIdItem {
  id: string // 唯一标识符
  lastUpdated: number // 最后更新时间戳
}

/**
 * 统计项接口
 */
export interface GreasyForkStatsItem {
  ids: GreasyForkIdItem[] // ID项数组
  count?: number // 可选统计计数
  lastUpdated: number // 最后更新时间戳
}

/**
 * 更新操作类型
 */
export enum UpdateOperation {
  Add = 'add',
  Remove = 'remove',
}

// 存储分类
export type GreasyForkStorageCategory
  = | 'script.meta'
    | 'script.liker'
    | 'script.status'
    | 'feedback.meta'
    | 'feedback.tags'
    | 'feedback.status'
    | 'user.meta'
    | 'user.types'

// 各分类对应的键类型
export type GreasyForkStorageKey<T extends GreasyForkStorageCategory>
  = T extends 'script.meta' ? number
    : T extends 'script.liker' ? ScriptFeedbackActionType
      : T extends 'script.status' ? ScriptStatusActionType
        : T extends 'feedback.meta' ? number
          : T extends 'feedback.tags' ? FeedbackTagType
            : T extends 'feedback.status' ? ResolutionStatusType
              : T extends 'user.meta' ? number
                : T extends 'user.types' ? GreasyForkUserType : never

export interface GreasyForkStats {
  script: {
    meta: Array<{
      id: string
      name: string
    }>
    features: {
      showSearch: boolean
      showQuickSearch: boolean
      showSortButton: boolean
    }
    liker: EnumValueKeys<typeof ScriptFeedbackActionType>
    status: EnumValueKeys<typeof ScriptStatusActionType>
  }
  feedback: {
    meta: Array<{
      id: string
      description: string
    }>
    tags: EnumValueKeys<typeof FeedbackTagType>
    status: EnumValueKeys<typeof ResolutionStatusType>
  }
  user: {
    meta: Array<{
      id: string
      name: string
    }>
    types: EnumValueKeys<typeof GreasyForkUserType>
  }
  lastUpdateTime: number
}

/**
 * 创建空统计项
 */
export function createEmptyStatsItem(): GreasyForkStatsItem {
  return {
    ids: [],
    count: 0,
    lastUpdated: Date.now(),
  }
}

/**
 * 创建ID项
 */
export function createIdItem(id: string): GreasyForkIdItem {
  return {
    id,
    lastUpdated: Date.now(),
  }
}

/**
 * 使用枚举值作为键创建统计映射
 */
function createStatsMapByValues<T extends Record<string, string>>(
  enumObj: T,
): EnumValueKeys<T> {
  return Object.values(enumObj).reduce((acc, value) => {
    (acc as Record<string, GreasyForkStatsItem>)[value] = createEmptyStatsItem()
    return acc
  }, {} as EnumValueKeys<T>)
}

/**
 * 默认脚本统计配置
 */
export const DEFAULT_GREASY_FORK_STATS: GreasyForkStats = {
  script: {
    meta: [],
    features: {
      showSearch: true,
      showQuickSearch: true,
      showSortButton: true,
    },
    liker: createStatsMapByValues(ScriptFeedbackActionType),
    status: createStatsMapByValues(ScriptStatusActionType),
  },
  feedback: {
    meta: [],
    tags: createStatsMapByValues(FeedbackTagType),
    status: createStatsMapByValues(ResolutionStatusType),
  },
  user: {
    meta: [],
    types: createStatsMapByValues(GreasyForkUserType),
  },
  lastUpdateTime: Date.now(),
}
